<?php

use App\Utils\RedisUtils;
use Illuminate\Support\Facades\Redis;
use Ramsey\Uuid\Uuid;
use App\Models\User;
use App\Models\AdminUser;

/**
 * @param $data
 * @param int $code 状态码 200为成功 400为提示性错误信息 401为登录错误信息 直接重新登录即可
 * @param null $msg
 */
function SetReturnJson($data, $code = 200, $msg = null)
{
// msg 的默认值
    if (is_null($msg) && $code != 200) {
        $msg = 'error';
    } else if (is_null($msg) && $code == 200) {
        $msg = 'success';
    }
    $info = [
        'code' => $code,
        'result' => $data,
        'msg' => $msg
    ];
    exit(json_encode($info));
}

//直接抛出异常
function throwError($message = 'Error')
{
    SetReturnJson([], 400, $message);
}

/**生成密码
 * @param $password
 * @return string
 */
function pass_hash($password)
{
    return md5(md5($password) . 'pass_salt_SmTRx');
}

function getUser()
{
    $token = $_SERVER['HTTP_TOKEN'] ?? ''; // 获取所有头部参数
    if (!$token) {
        //如果未传入鉴权token，则不可执行
        SetReturnJson([], 401, '登录过期,请重新登录');
    }
    if (!$user = RedisUtils::getUserInfo($token)) {
        //Redis无数据需要重新登录
        SetReturnJson([], 401, '登录过期,请重新登录');
    } else {
        //如果用户有操作，则延长时间
        Redis::setex($token, 3600 * 24 * 7, RedisUtils::getUserInfo($token));
    }
    $id = json_decode($user, true)['id'];
    if (!$user = User::where(['id' => $id])->whereNull('deleted_at')->first()) {
        SetReturnJson([], 401, '登录过期,请重新登录');
    }
    return $user;
}

function getStoreUser()
{
    $token = $_SERVER['HTTP_TOKEN'] ?? ''; // 获取所有头部参数
    if (!$token) {
        //如果未传入鉴权token，则不可执行
        SetReturnJson([], 401, '登录过期,请重新登录');
    }
    if (!$user = RedisUtils::getStoreUserInfo($token)) {
        //Redis无数据需要重新登录
        SetReturnJson([], 401, '登录过期,请重新登录');
    } else {
        //如果用户有操作，则延长时间
        Redis::setex($token, 3600 * 24 * 7, RedisUtils::getStoreUserInfo($token));
    }
    $id = json_decode($user, true)['id'];
    if (!$user = AdminUser::where(['id' => $id])->whereNull('deleted_at')->first()) {
        SetReturnJson([], 401, '登录过期,请重新登录');
    }
    return $user;
}

/**获取用户uid 这里不做登录判断
 * @return false
 */
function getUserId()
{
    $token = $_SERVER['HTTP_TOKEN'] ?? ''; // 获取所有头部参数
    if (!$token) {
        //如果未传入鉴权token，则不可执行
        return false;
    }
    if (!$user = RedisUtils::getUserInfo($token)) {
        //Redis无数据需要重新登录
        return false;
    }
    if (!$user = User::find(json_decode($user, true)['id'])) {
        return false;
    }
    return $user->id;
}

function SetToken()
{
    $data = Uuid::uuid1();
    $str = $data->getHex();
    return $str;
}

function GetRandStr($length)
{
    //字符组合
    $str = 'abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789';
    $len = strlen($str) - 1;
    $randstr = '';
    for ($i = 0; $i < $length; $i++) {
        $num = mt_rand(0, $len);
        $randstr .= $str[$num];
    }
    return $randstr;
}

/**
 * 生成订单号
 * @return string
 */
function createOrderNo()
{
    return date('Ymd') . substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}

/**获取离今天结束的时间戳
 * @return false|int
 */
function getTodayLastTime()
{
    $endToday = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;
    return $endToday - time();
}

//生成密码
function encryptPassword(string $password): string
{
    return password_hash($password, PASSWORD_DEFAULT, ['cost' => 10]);
}

/**验证密码
 * @param $value
 * @param $hashedValue
 * @return bool
 */
function checkPassword($value, $hashedValue): bool
{
    if (strlen($hashedValue) === 0) {
        return false;
    }

    return password_verify($value, $hashedValue);
}
